package com.ruoyi.service.impl;

import com.ruoyi.entity.AttendanceRecord;
import com.ruoyi.mapper.AttendanceMapper;
import com.ruoyi.service.Attendance;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.ZoneId;
import java.util.Date;

/**
 * @Classname AttendanceImpl
 * @Description
 * @Date 2025/11/1 19:04
 * @Created by SYL
 */

@Service
public class AttendanceImpl implements Attendance {

    @Autowired
    private  AttendanceMapper attendanceMapper;



    /**
     * 执行打卡操作
     * @param username 用户名
     * @return 打卡结果（1=正常，2=打过了）
     */
    @Override
    public int executeCheckIn(String username) {
        System.out.println("执行打卡操作，用户名：" + username);
        // 从数据库中查询用户ID
        String userId = attendanceMapper.selectUserIdByUsername(username);
        System.out.println("userId = " + userId);
        if (userId == null) {
            throw new IllegalArgumentException("用户不存在");
        }
        System.out.println("开始查询用户 = " + userId);
         AttendanceRecord user=new AttendanceRecord();
         //todo 有bug 如果当天有多条记录 会报错
         AttendanceRecord record = attendanceMapper.selectUserDayDak(Integer.parseInt(userId));
        System.out.println("record = " + record);
        if (record != null) {
            System.out.println("当天有打卡记录，打卡时间：" + record.getCheckInTime());
            // 将 查询到对象的时间Date 转换为 LocalTime
            LocalTime checkTime = record.getCheckInTime().toInstant()
                    .atZone(ZoneId.systemDefault())
                    .toLocalTime();

            //判断上午下午
            if (checkTime.isBefore(LocalTime.NOON)) {
                // 上无
                System.out.println("上午以打卡");
                return 2; //上午以打卡
            } else {
                System.out.println("下午以打卡");
                // 下午
                user.setCheckType(1); //设置为下班打卡
                user.setUserId(Long.parseLong(userId));//设置用户ID
                user.setCheckInTime(new java.util.Date());//设置打卡时间
                user.setStatus(2);//设置状态为早退
                int i = attendanceMapper.insertCheckIn(user);
                return i; //返回插入结果
            }
        }else {//正常打卡
            System.out.println("正常打卡");
            // 当天9点
            LocalDateTime nineAM = LocalDateTime.now()
                    .withHour(9)
                    .withMinute(0)
                    .withSecond(0)
                    .withNano(0);
            Date date = Date.from(nineAM.atZone(ZoneId.systemDefault()).toInstant());

            // 获取当前打卡时间
            LocalDateTime currentTime = LocalDateTime.now();

            // 比较时间早晚
            if (currentTime.isAfter(nineAM)) {
                // 当前时间比9点晚 -> 迟到
                user.setStatus(1); // 设置为迟到状态
            } else {
                // 当前时间不晚于9点 -> 正常
                user.setStatus(0); // 设置为正常状态
            }
            user.setCheckType(0); //设置为上班打卡
            user.setUserId(Long.parseLong(userId));//设置用户ID
            user.setCheckInTime(new java.util.Date());//设置打卡时间
            user.setStatus(0);//设置状态为正常
            int i = attendanceMapper.insertCheckIn(user);
            return i; //返回插入结果
        }

    }
}
